Passed
Pull Request — master (#75)
by Mathieu
01:28
created

GetEventsOverview.index   A

Complexity

Conditions 4

Size

Total Lines 36
Code Lines 32

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 32
dl 0
loc 36
rs 9.112
c 0
b 0
f 0
cc 4
1
import {Event} from './Event.entity';
2
import {IEventsOverview} from './IEventsOverview';
3
4
export class GetEventsOverview {
5
  public index(events: Event[]): IEventsOverview {
6
    const eventsByDate = [];
7
    const overview: IEventsOverview = {
8
      mission: 0,
9
      dojo: 0,
10
      formationConference: 0,
11
      holiday: 0,
12
      medicalLeave: 0,
13
      support: 0,
14
      workFree: 0,
15
      other: 0,
16
      mealTicket: 0,
17
      totalTimeSpent: 0
18
    };
19
20
    for (const event of events) {
21
      const dayIndex = new Date(event.getDate()).getDate() - 1;
22
      const time = event.getTime() / 100;
23
      const type = event.getType();
24
25
      if (eventsByDate[dayIndex]) {
26
        eventsByDate[dayIndex].push({time, type});
27
      } else {
28
        eventsByDate[dayIndex] = [{time, type}];
29
      }
30
31
      overview[event.getType()] += time;
32
33
      if (Event.WORKED_TYPES.includes(type)) {
34
        overview.totalTimeSpent += time;
35
      }
36
    }
37
38
    return this.calculateNumberOfMealTicket(
39
      overview,
40
      Object.values(eventsByDate)
41
    );
42
  }
43
44
  public calculateNumberOfMealTicket(
45
    overview: IEventsOverview,
46
    eventsByDate: any[]
47
  ): IEventsOverview {
48
    for (const sortedEvent of eventsByDate) {
49
      let totalPerDay = 0;
50
51
      for (const {time, type} of sortedEvent) {
52
        if (Event.WORKED_TYPES.includes(type)) {
53
          totalPerDay += time;
54
        }
55
      }
56
57
      if (totalPerDay > 0.5) {
58
        overview.mealTicket++;
59
      }
60
    }
61
62
    return overview;
63
  }
64
}
65